export default function bwPowerSet(originalSet) {
  const subSets = []
    
  //我们将有 2^n 种可能的组合（其中 n 是原始集合的长度）。
  //这是因为对于原始集合的每个元素我们都会决定是否包含
  //是否（每个集合元素有 2 个选项）。
  const numberOfCombinations = 2 ** originalSet.length
    
  //0 到 2^n 范围内的每个二进制表示的数字都完全符合我们的需要：
  //它通过其位（0 或 1）显示是否包含集合中的相关元素。
  //例如，对于集合 {1, 2, 3}，二进制数 0b010 意味着我们需要
  //仅包含“2”到当前集合中。
  for (let combinationIndex = 0; combinationIndex < numberOfCombinations; combinationIndex += 1) {
    const subSet = []
    
    for (let setElementIndex = 0; setElementIndex < originalSet.length; setElementIndex += 1) {
     //决定是否需要将当前元素包含到子集中。
      if (combinationIndex & (1 << setElementIndex)) {
        subSet.push(originalSet[setElementIndex])
      }
    }
    
   //将当前子集添加到所有子集列表中。
    subSets.push(subSet)
  }
  
  return subSets
}
